/*
 * Project Name spring-boot-tools
 * File Name AbstractCreateTable
 * Package Name com.huxiaosu.toole.autocreate.tables
 * Create Time 2024/7/11
 * Create by name：liujie
 */
package com.huxiaosu.tools.autocreate.tables;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.huxiaosu.tools.autocreate.common.DdlType;
import com.huxiaosu.tools.autocreate.config.AutoCreateTableProperties;
import com.huxiaosu.tools.autocreate.utils.FieldInfo;
import com.huxiaosu.tools.autocreate.utils.TableInfo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.env.Environment;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Description
 *
 * @author liujie
 * @date 2024/7/11 13:43
 */
public abstract class AbstractCreateTable{
    // 创建一个包含支持的类型名称的列表
    List<String> supportedDdlTypes = Arrays.stream(DdlType.values()).map(DdlType::name).collect(Collectors.toList());

    /**
     * 加载配置文件中的数据信息；
     * <p>创建表信息的时候优先读取 tools.create.table.datasource</p>
     * <p>如果没值；就读取 spring.datasource 配置</p>
     *
     * @param datasource 用户配置信息
     *                   <p>
     *                   {@link AutoCreateTableProperties#getDatasource()} 中的datasource配置
     *                   <li>root,root,jdbc:mysql://127.0.0.1:3306,demo</li>
     *                   </p>AbstractCreateTable
     */
    public abstract void initConnection(String datasource);

    /**
     * 获取删除表 SQL
     * @param schema 数据库名字
     * @param tableName 表名

     * @return java.lang.String
     * @author liujie
     * @date 2024/7/11 18:01
     */
    public abstract String getDropTableSql(final String schema,final String tableName);
    /**
     * 获取表信息的SQL
     * @param schema 数据库名字
     * @param tableName 表名

     * @return java.lang.String
     * @author liujie
     * @date 2024/7/11 18:01
     */
    public abstract String checkTableSql(final String schema,final String tableName);
    /**
     * 获取表中字段的 SQL
     * @param schema 数据库名字
     * @param tableName 表名

     * @return java.lang.String
     * @author liujie
     * @date 2024/7/11 18:01
     */
    public abstract String getTableColumnSql(final String schema,final String tableName);
    /**
     * 构建建表 SQL
     *
     * @param schema    数据库名字
     * @param tableInfo 字段信息
     * @return java.lang.String
     * @author liujie
     * @date 2024/7/11 17:37
     */

    public abstract String createTableSql(final String schema, final TableInfo tableInfo);

    /**
     * 构建表新增字段 SQL
     *
     * @param schema    数据库名字
     * @param tableName 表名
     * @param fieldInfo 字段信息
     * @return java.lang.String
     * @author liujie
     * @date 2024/7/11 17:37
     */

    public abstract String addTableColumnSql(final String schema, final String tableName, final FieldInfo fieldInfo);

    /**
     * 构建表删除字段 SQL
     *
     * @param schema    数据库名字
     * @param tableName 表名
     * @param columnName 删除的字段名字
     * @return java.lang.String
     * @author liujie
     * @date 2024/7/11 17:37
     */

    public abstract String deleteTableColumnSql(final String schema, final String tableName, final String columnName);

    /**
     * 构建表修改字段 SQL
     *
     * @param schema    数据库名字
     * @param tableName 表名
     * @param fieldInfo 字段信息
     * @return java.lang.String
     * @author liujie
     * @date 2024/7/11 17:37
     */

    public abstract String modifyTableColumnSql(final String schema, final String tableName, final FieldInfo fieldInfo);

    /**
     * 读取 spring.datasource 配置
     *
     * @param environment 配置信息
     * @return java.sql.Connection
     * @author liujie
     * @date 2024/7/11 13:50
     */
    protected AutoCreateTableProperties.DataSourceConfig getSpringBootDatabase(Environment environment) {
        String dbUrl = environment.getProperty("spring.datasource.url");
        String dbUsername = environment.getProperty("spring.datasource.username");
        String dbPassword = environment.getProperty("spring.datasource.password");
        if (StringUtils.isBlank(dbUrl) || StringUtils.isBlank(dbUsername) || StringUtils.isBlank(dbPassword)) {
            throw new RuntimeException("没有配置数据库相关信息；spring.datasource is null...");
        }
        // root,root,jdbc:mysql://127.0.0.1:3306/demo
        AutoCreateTableProperties.DataSourceConfig dataSourceConfig = new AutoCreateTableProperties.DataSourceConfig();
        String temp = dbUsername+StringPool.COMMA+dbPassword+StringPool.COMMA+dbUrl;
        dataSourceConfig.setDatasource(temp);
        return dataSourceConfig;
    }

    /**
     * 获取用户配置的实体包信息
     *
     * @param autoCreateTableProperties 用户配置文件信息
     * @return java.util.List<java.lang.String>
     * @author liujie
     * @date 2024/7/11 13:55
     */
    protected List<String> getEntityPackage(AutoCreateTableProperties autoCreateTableProperties) {
        List<String> entityPackages = autoCreateTableProperties.getEntityPackages();
        if (CollUtil.isEmpty(entityPackages)) {
            String entityPackage = autoCreateTableProperties.getEntityPackage();
            if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isBlank(entityPackage)) {
                throw new RuntimeException("tools.create.table entityPackage 配置错误");
            }
            // 用户使用字符串配置的
            entityPackages = Arrays.asList(entityPackage.split(StringPool.COMMA));
            if (CollUtil.isEmpty(entityPackages)) {
                entityPackages = Arrays.asList(entityPackage.split(StringPool.SEMICOLON));
            }
        }
        return entityPackages;
    }
}